package com.coastline.fruit.mq.config;

import com.coastline.fruit.mq.constant.Constants;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;

/**
 * 发送者回执配置
 *
 * @author Coastline
 * @date 2025/2/19 16:55
 */
@Slf4j
@Configuration
public class MessageConfig implements ApplicationContextAware {

    /**
     * 发送者回执没有路由到队列的情况
     * 如果消息没有投递到队列时，检查交换机名称是否包含delayed（是否为延迟消息），如果是，则不需要记录日志，如果不是则需要记录相关的日志
     *
     * @param applicationContext the ApplicationContext object to be used by this object
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // applicationContext可以获取容器中任意的bean实例 此处获取的是RabbitTemplate的bean实例
        RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);

        // 记录回执 根据情况记录 只有消息没有被正确的投递才会执行
        rabbitTemplate.setReturnsCallback(message -> {
            if(StringUtils.contains(message.getExchange(), Constants.MQ.DELAYED_KEYWORD)){
                //延迟消息没有发到队列是正常情况，无需记录日志
                return;
            }
            // 如果不是延迟队列 则需要记录日志
            log.error("消息没有投递到队列，应答码：{}，原因：{}，交换机：{}，路由键：{}，消息：{}",
            message.getReplyCode(),message.getReplyText(),message.getExchange(),message.getRoutingKey(),message.getMessage());
        });
    }
}
